﻿using System;
using System.Collections.Generic;

//4.11.5 动态类型的运行时表现
//dynamic 和 object 类型之间可以执行一个深度等值比较。在运行时，下面这个表达式的结果未true：
// typeof(dynamic) == typeof(object)
//我们可以将这个原理扩展到结构类型和数组类型：
// typeof(List<dynamic>) == typeof(List<object>)
// typeof(dynamic[]) == typeof(object[])
//与对象引用相似，动态引用也可以指向除指针类型以外的任意类型的对象：
//dynamic x = "hello";
//Console.WriteLine(x.GetType().Name); // String
//x = 123; // 正确（尽管是同一个变量）
//Console.WriteLine(x.GetType().Name); // Int32
namespace _132_动态绑定_动态类型的运行时表现
{
    class Program
    {
        static void Main(string[] args)
        {
            //Console.WriteLine(typeof(dynamic) == typeof(object)); //typeof 运算符不能用在动态类型上
            Console.WriteLine(typeof(List<dynamic>) == typeof(List<object>)); // True
            Console.WriteLine(typeof(dynamic[]) == typeof(object[])); // True

            //与对象引用相似，动态引用也可以指向除指针类型以外的任意类型的对象：
            dynamic x = "hello";
            Console.WriteLine(x.GetType().Name); // String
            x = 123; // 正确，尽管是同一个变量
            Console.WriteLine(x.GetType().Name); // Int32
            //在结构上，对象引用和动态引用之间没有任何区别。
            //动态引用可以直接在它所指的对象上执行动态操作。
            //可以从object转换到dynamic，以便执行任何一个希望在object上执行的动态操作：
            object o = new System.Text.StringBuilder();
            dynamic d = o;
            d.Append("hello");
            Console.WriteLine(o); // hello



            Console.ReadKey();
        }
        //提示：在一个提供公开的dynamic成员的类型上的反射表明这些成员是为了注释objects。例如：
        public class Test
        {
            public dynamic Foo;
        }
        //等价于：
        /*
        public class Test
        {
            [System.Runtime.CompilerServices.DynamicAttribute] //不要使用“System.Runtime.CompilerServices.DynamicAttribute”。请改用“dynamic”关键字。

            public object Foo;
        }
        */

        //这使该类型的使用者知道Foo应该作为动态类型使用，同时使不支持动态绑定的语言能够回退到对象的使用上。
    }
}
